/** Fichier définissant un hyperboloïde.
 *
 * Ce fichier contient la définition de la classe Hyperboloide.
 *
 * @file Hyperboloide.hpp
 * @author Johan "Solo" Luisier
 * @date 3 Juillet 2011
 */
#ifndef HYPERBOLOIDE_HPP
#define HYPERBOLOIDE_HPP

#include "FormeComposee.hpp"

#include "Plan.hpp"
#include "BaseHyperboloide.hpp"

/** Classe implémentant l'hyperboloïde pour le raytracing.
 *
 * Classe qui implémente l'hyperboloïde, qui est définit par l'équation
 * \f$ \frac{ x^2 }{ a^2 } + \frac{ y^2 }{ b^2 } - \frac{ z^2 }{ c^2 }
 * = 1 \f$. L'hyperboloïde créé est également limité dans l'espace
 * par deux plan et a donc deux "hauteurs".
 *
 * L'instance est représentée comme l'intersection d'une instance de
 * BaseHyperboloide et de deux intances de Plan.
 *
 * Pour résoudre l'intersection, on passe dans les coordonées locales
 * et on se réduit au cas \f$ a = b = c = 1 \f$.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 3 Juillet 2011
 *
 * @class Hyperboloide "Hyperboloide.hpp" "Formes/Hyperboloide.hpp"
 */
class Hyperboloide : public FormeComposee
{
public:
    Hyperboloide();
    Hyperboloide( const Coord& sommet, const Vecteur& axeX, const Vecteur& axeY,
                  const Vecteur& axeZ,
                  const double& echelleX, const double& echelleY,
                  const double& echelleZ,
                  const double& hauteurP, const double& hauteurM );
    //Hyperboloide( const Hyperboloide& par );
    virtual ~Hyperboloide();
private:
    /**
     * Liste des plans délimitant l'hyperboloïde dans l'espace.
     */
    std::vector< Plan::SharedPtr > ListePlan;
    /**
     * Pointeur sur l'instance de BaseHyperboloïde, qui défini le corps
     * de l'hyperboloïde.
     */
    BaseHyperboloide::SharedPtr BHyperbole;
};

#endif // HYPERBOLOIDE_HPP
